package ar.uba.fi.tonyvaliente.documents;

import java.util.NoSuchElementException;


/**
 * Iterador que devuelve todos los IDs de documentos desde
 * 1 hasta el total de documentos del indice invertido, mientras
 * no esten entre los devueltos por el iterador encapsulado.
 * NOTA IMPORTANTE: Supone IDs correlativos
 * @author dmorello
 */
public class NegatedResultIterator extends ResultIterator {

	private ResultIterator idIterator;
	private int idActual;
	private int ultimoId;

	public NegatedResultIterator(ResultIterator idIterator) {
		super(idIterator.totalDocumentos);
		this.idIterator = idIterator;
		this.idActual = 0;
		this.ultimoId = 0;
	}

	public boolean hasNext() {
		return idIterator.hasNext() || idActual < totalDocumentos;
	}

	public Integer next() {
		if (idActual == 0) {
			// Primera vez que se llama al metodo
			// Incremento el id hasta encontrar un valor que no este en el iterador
			do {
				ultimoId = idIterator.next(); // Al menos tiene un elemento
				idActual++;
			} while (idActual == ultimoId);
		} else {
			// Verifico que no me pase del total de documentos
			if (idActual < totalDocumentos) {
				// Incremento el id hasta encontrar un valor que no este en el iterador
				idActual++;
				while (idActual == ultimoId) {
					// Puedo haber llegado al final del iterador encapsulado
					if (idIterator.hasNext()) {
						ultimoId = idIterator.next();
					}
					idActual++;
				}
			} else {
				throw new NoSuchElementException("No hay mas elementos en el ResultIterator");
			}
		}
		// Devuelvo el id calculado
		return idActual;
	}
}

